/**
 * 日期处理模块
 * @module utils/date
 */
import dayjs from 'dayjs';
import quarterOfYear from 'dayjs/plugin/quarterOfYear';
dayjs.extend(quarterOfYear);

/**
 * 日期格式转换函数
 * @param  {String|Date} dateStr 日期时间对象或字符串
 * @param  {String} [format] 输出格式，   YYYY-MM-DD hh:mm:ss
 * @param  {Object} [options] 时间偏移对象，可选 {y,M,d,h,m,s}
 * @param {Number} options.y 年偏移量，+增加， -减少
 * @param {Number} options.M 月偏移量，+增加， -减少
 * @param {Number} options.d 日偏移量，+增加， -减少
 * @param {Number} options.h 时偏移量，+增加， -减少
 * @param {Number} options.m 分偏移量，+增加， -减少
 * @param {Number} options.s 秒偏移量，+增加， -减少
 * @returns {String|Date} 如不传递format，即返回Date类型
 *
 * @example
 * // 当前时间减少一天, 并转换格式
 *  date(new Date(), 'YYYY-MM-DD', {d: -1})
 */
export function date(dateStr: string | Date = new Date(), format = 'YYYY-MM-DD hh:mm:ss', { Y = 0, M = 0, D = 0, h = 0, m = 0, s = 0 } = {}) {
	let obj = typeof dateStr === 'string' ? new Date(dateStr.replace(/-/g, '/')) : dateStr;

	obj = new Date(Y + obj.getFullYear(), M + obj.getMonth(), D + obj.getDate(), h + obj.getHours(), m + obj.getMinutes(), s + obj.getSeconds());

	const o: { [key: string]: number } = {
		'M+': obj.getMonth() + 1,
		'D+': obj.getDate(),
		'h+': obj.getHours(),
		'H+': obj.getHours(),
		'm+': obj.getMinutes(),
		's+': obj.getSeconds(),
		'q+': Math.floor((obj.getMonth() + 3) / 3),
		S: obj.getMilliseconds()
	};
	if (format) {
		if (/(Y+)/i.test(format)) {
			format = format.replace(RegExp.$1, `${obj.getFullYear()}`.substr(4 - RegExp.$1.length));
		}
		for (const k in o) {
			if (new RegExp(`(${k})`).test(format)) {
				format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k].toString() : `00${o[k]}`.substr(`${o[k]}`.length));
			}
		}
		return format;
	} else {
		return obj;
	}
}

/**
 *日期差值计算
 @param {String|Date} date1 日期时间对象或字符串
 @param {string|Date} date2 日期时间对象或字符串
 @param@param{object} type 差值的格式，https://dayjs.ffenxianglu.cn/category/display.html#%E5%B7%AE%E5%BC%82-diff* 
 */
const typeobj: { [key: string]: string } = {
	year: '年',
	y: '年',
	month: '月',
	M: '月',
	quarter: '季度',
	Q: '季度',
	week: '周',
	w: '周',
	day: '天',
	d: '天',
	hour: '小时',
	h: '小时',
	minute: '分钟',
	m: '分钟',
	second: '秒',
	s: '秒',
	millisecond: '毫秒',
	ms: '毫秒'
};

// 导出一个函数，用于计算两个日期之间的差值
export function betweenDates(date1: string | Date, date2: string | Date, type: string = 'd', flot = 0) {
	// 将传入的日期转换为dayjs对象
	const Date1 = dayjs(date1),
		Date2 = dayjs(date2);
	// 计算两个日期之间的差值，type参数指定差值的类型，true参数表示返回浮点数
	const data = Date1.diff(Date2, type as any, true);
	// 将差值转换为指定的小数位数，并加上差值的类型
	return data.toFixed(flot) + typeobj[type];
}

export const lastYearStart = dayjs().subtract(1, 'year').startOf('year').format('YYYY-MM-DD HH:mm:ss');

export const lastYearEnd = dayjs().subtract(1, 'year').endOf('year').format('YYYY-MM-DD HH:mm:ss');

export const nowYearStart = dayjs().startOf('year').format('YYYY-MM-DD HH:mm:ss');

export const nowYearEnd = dayjs().endOf('year').format('YYYY-MM-DD HH:mm:ss');

export const lastMonthStart = dayjs().subtract(1, 'month').startOf('month').format('YYYY-MM-DD HH:mm:ss');

export const lastMonthEnd = dayjs().subtract(1, 'month').endOf('month').format('YYYY-MM-DD HH:mm:ss');

export const nowMonthStart = dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss');

export const nowMonthEnd = dayjs().endOf('month').format('YYYY-MM-DD HH:mm:ss');

export const lastQuarterhStart = dayjs().subtract(1, 'quarter').startOf('quarter').format('YYYY-MM-DD HH:mm:ss');

export const lastQuarterEnd = dayjs().subtract(1, 'quarter').endOf('quarter').format('YYYY-MM-DD HH:mm:ss');

export const nowQuarterStart = dayjs().startOf('quarter').format('YYYY-MM-DD HH:mm:ss');

export const nowQuarterEnd = dayjs().endOf('quarter').format('YYYY-MM-DD HH:mm:ss');

export const lastDayhStart = dayjs().subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss');

export const lastDayEnd = dayjs().subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss');

export const nowDayStart = dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss');

export const nowDayEnd = dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss');
